#ifndef CAMARA_ESFERICA_H_
#define CAMARA_ESFERICA_H_

#include <GL/glut.h>
#include <assert.h>
#include "camara.h"

class CamEsferica : public Camara {

    private:
        float _latitud;
        float _longitud;
        float _distancia;

        float p_x;
        float p_y;
        float p_z;

        float n_x;
        float n_y;
        float n_z;

        float _x;
        float _y;
        float _z;

        float ejeLatitud_x;
        float ejeLatitud_y;
        float ejeLatitud_z;
    
    public:

        /*
         * Construye una camara esferica con coordenadas
         * (latitud, longitud, distancia)
         *
         * Inicialmente, latitud = longitud = 0 grados
         *                  distancia = 1
         *
         * Para la construccion se requiere definir el plano
         * del ecuador, esto es un plano que divide a la mitad la
         * esfera y en el cual esta contenido el ecuador.
         *
         * El punto p (p_x, p_y, pz) representa un punto en dicho
         * plano, junto al punto (0, 0, 0). Note que esto dice que
         * la direccion p esta contenida sobre el plano.
         *
         * Sin embargo esto define infinitos planos (hay infinitos planos
         * que contienen simulataneamente al origen y a p)
         *
         * Se requiere ademas un vector normal al plano (n_x, n_y, n_z)
         * para definir el plano.
         * Dicho vector sirve como eje de rotacion (por definicion) de
         * las rotaciones de longitud.
         *
         * El angulo longitud hace rotar en circunferencias paralelas al
         * plano del ecuador. 
         * El angulo longitud = 0 es definido como el angulo con 
         * referencia con la recta (0, 0, 0)-(p_x, p_y, p_z)
         *
         * El angulo latitud elevan el plano de rotacion, rotando este
         * en funcion del eje ortogonal al vector p y la normal.
         * Con latitud = 0, la circunferencia de rotacion coincide
         * con el plano del ecuador.
         *
         */

        CamEsferica(float p_x, float p_y, float p_z,
                float n_x, float n_y, float n_z);

        void ver() const;

        inline float latitud() const { return _latitud; }
        inline void latitud(float angulo) { _latitud = angulo; }

        inline float longitud() const { return _longitud; }
        inline void longitud(float angulo) { _longitud = angulo; }

        inline float distancia() const { return _distancia; }
        inline void distancia(float dist) { 
           assert(dist > 0);
           _distancia = dist; 
        }
        
        inline float x() const { return _x; }
        inline void x(float centro_x) { _x = centro_x; }
        
        inline float y() const { return _y; }
        inline void y(float centro_y) { _y = centro_y; }
        
        inline float z() const { return _z; }
        inline void z(float centro_z) { _z = centro_z; }

};

#endif
